#include "dboperation.h"
#include <QDebug>
#include <qsqlquery.h>

DBOperation::DBOperation(QObject *parent) : QObject(parent)
{
    // 如果这个数据库实例已经存在了, 就什么也不做, 如果不存在就添加一个实例对象
    if(!QSqlDatabase::contains())
    {
        m_db = QSqlDatabase::addDatabase("QOCI");
        qDebug() << "数据库实例添加成功了...";
    }
    qDebug() << "do nothing...";
}

bool DBOperation::connectDB(QString user, QString pwd, QString host, unsigned short port, QString dbName)
{
    bool flag = false;
    if(!m_db.isOpen())
    {
        // 没有打开
        // 初始化连接信息
        m_db.setHostName(host);
        m_db.setPort(port);
        m_db.setDatabaseName(dbName);
        m_db.setUserName(user);
        m_db.setPassword(pwd);
        // 连接数据库
        flag = m_db.open();
        if(flag)
        {
            qDebug() << "数据库连接成功了...";
        }
    }
    else
    {
        qDebug() << "数据库已经打开了, 无需做任何操作...";
    }
    return flag;
}

void DBOperation::disConnectDB()
{
    m_db.close();
}

// 登录是时候调用的函数
bool DBOperation::userAuthentication(QString id, QString pwd)
{
    // 查询的是网点信息表 - secnode
    QString sql = QString("select * from secnode where id='%1' and password='%2'")
            .arg(id).arg(pwd);
    QSqlQuery query(sql);
    // 执行sql
    query.exec();
    // 如果有结果集, 应该得到1条记录, 如果用户信息有误, 得到一个空结果集
    if(query.next())
    {
        return true;
    }
    return false;
}

bool DBOperation::isValideClient(QString id)
{
    // 查询的是网点信息表 - secnode
    QString sql = QString("select * from secnode where id='%1' and state=1").arg(id);
    qDebug() << sql;
    QSqlQuery query(sql);
    // 执行sql
    query.exec();
    // 如果有结果集, 应该得到1条记录, 如果用户信息有误, 得到一个空结果集
    if(query.next())
    {
        return true;
    }
    return false;
}

bool DBOperation::insertSeckeyInfo(SeckeyInfo &info)
{
    // 操作的数据库表 -> seckeyinfo
    QString sql = QString("insert into seckeyinfo values('%1', '%2', %3, sysdate, %4, '%5')")
            .arg(info.clientID).arg(info.serverID).arg(info.seckeyID).arg(info.status).arg(info.seckey);
    qDebug() << sql;
    QSqlQuery query;
    // 执行sql语句, 开启事务
    m_db.transaction();
    bool bl = query.exec(sql);
    qDebug() << "bl = " << bl;
    if(bl)
    {
        // 更新keysn表中的ikeysn字段, +1
        sql = QString("update keysn set ikeysn=%1").arg(info.seckeyID+1);
        qDebug() << sql;
        bool flag = query.exec(sql);
        if(flag)
        {
            // 所有的写操作都执行成功了, 提交数据
            m_db.commit();
            qDebug() << "commit...";
            return true;
        }
    }
    // 操作过程中有一步失败了
    m_db.rollback();
    qDebug() << "rollback ...";
    return false;
}

bool DBOperation::modifyKeyStatus(int keyID, bool status)
{
    // 操作的数据库表 -> seckeyinfo
    QString sql = QString("update seckeyinfo set state=%1 where keyid=%2")
            .arg(status).arg(keyID);
    QSqlQuery query(sql);
    // 开启事务
    m_db.transaction();
    // 执行sql语句
    bool fl = query.exec();
    if(fl)
    {
        m_db.commit();
    }
    else
    {
        m_db.rollback();
    }
    return fl;
}

int DBOperation::getKeyID()
{
    int keyid = -1;
    // 操作的数据库表 -> keysn
    QSqlQuery query("select ikeysn from keysn");
    query.exec();
    // 读结果集中的唯一的值
    if(query.next())
    {
        keyid = query.value(0).toInt();
    }
    return keyid;
}
